#ifndef HTTP_CONTEXT_H
#define HTTP_CONTEXT_H

#include "http_request.h"
#include "http_util.h"
#include "buffer.h"

/**
 * @brief HTTP请求解析状态枚举
 * 表示HTTP请求接收和解析的不同阶段
 */
typedef enum 
{
    RECV_HTTP_ERROR,   // 解析错误
    RECV_HTTP_LINE,    // 解析请求行
    RECV_HTTP_HEAD,    // 解析请求头
    RECV_HTTP_BODY,    // 解析请求体
    RECV_HTTP_OVER     // 解析完成
} HttpRecvStatu;

constexpr int MAX_LINE = 8192;  // HTTP请求行/头的最大长度限制

namespace http {

/**
 * @brief HTTP请求解析上下文类
 * 负责接收并解析HTTP请求，维护解析状态，将结果存储到HttpRequest对象
 */
class HttpContext 
{
public:
    /**
     * @brief 构造函数
     * 初始化解析状态为请求行解析阶段，响应状态码为200
     */
    HttpContext();

    /**
     * @brief 重置解析上下文
     * 清空所有状态，恢复初始状态，用于复用对象
     */
    void reSet();

    /**
     * @brief 获取响应状态码
     * @return 响应状态码（如400、200等）
     */
    int respStatu() const { return _respStatu; }

    /**
     * @brief 获取当前解析阶段
     * @return 解析阶段枚举值
     */
    HttpRecvStatu recvStatu() const { return _recvStatu; }

    /**
     * @brief 获取解析后的请求对象
     * @return 引用返回HttpRequest对象
     */
    HttpRequest& request() { return _request; }
    const HttpRequest& request() const { return _request; }

    /**
     * @brief 从缓冲区解析HTTP请求
     * 驱动解析过程，根据当前阶段调用对应的解析函数
     * @param buf 存储待解析数据的缓冲区
     */
    void recvHttpRequest(net::Buffer* buf);

private:
    /**
     * @brief 处理请求行解析阶段
     * 从缓冲区读取一行数据并解析
     * @param buf 数据缓冲区
     * @return 解析成功或需要更多数据返回true，失败返回false
     */
    bool recvHttpLine(net::Buffer* buf);

    /**
     * @brief 处理请求头解析阶段
     * 从缓冲区读取多行请求头并解析，直到遇到空行
     * @param buf 数据缓冲区
     * @return 解析成功或需要更多数据返回true，失败返回false
     */
    bool recvHttpHead(net::Buffer* buf);

    /**
     * @brief 处理请求体解析阶段
     * 从缓冲区读取请求体数据
     * @param buf 数据缓冲区
     * @return 解析成功或需要更多数据返回true，失败返回false
     */
    bool recvHttpBody(net::Buffer* buf);

private:
    /**
     * @brief 解析请求行（如"GET /index.html HTTP/1.1"）
     * @param line 待解析的请求行字符串
     * @return 解析成功返回true，失败返回false
     */
    bool parseHttpLine(const std::string& line);

    /**
     * @brief 解析请求头（如"Host: example.com"）
     * @param line 待解析的请求头行
     * @return 解析成功返回true，失败返回false
     */
    bool parseHttpHead(std::string& line);

private:
    int _respStatu;             // 响应状态码（解析错误时使用）
    HttpRecvStatu _recvStatu;   // 当前解析阶段
    HttpRequest _request;       // 解析后的请求对象
};

} // namespace http

#endif // HTTP_CONTEXT_H